function [b_seq, q] = Function_Generate_Base_Seq(N_PRB, u, v)
% base_seq Generate the (u, v) base sequence used by PUSCH DMRS,
%          corresponding to N_PRB RBs and one slot
% Inputs:      u                        - Group number. Must be an element of {0,1,...,29}
%              v                        - Base sequence number. Either v=0 or v=1
% Outputs:     b_seq                    - base sequqnece
%              q                        - root of the Zadoff-Chu sequqnce
% Spec:        3GPP TS 36.211 section 5.5.1 v13.0.0
            
%Generate the (u, v) base sequence used by PUSCH DMRS, corresponding to N_PRB RBs and one slot
        % table 5.5.1.2-1
phi_mtx_N_RB_1 = [...
            [ -1, 1, 3, -3, 3, 3, 1, 1, 3, 1, -3, 3];
            [ 1, 1, 3, 3, 3, -1, 1, -3, -3, 1, -3, 3];
            [ 1, 1, -3, -3, -3, -1, -3, -3, 1, -3, 1, -1];
            [-1, 1, 1, 1, 1, -1, -3, -3, 1, -3, 3, -1];
            [-1, 3, 1, -1, 1, -1, -3, -1, 1, -1, 1, 3];
            [1, -3, 3, -1, -1, 1, 1, -1, -1, 3, -3, 1];
            [-1, 3, -3, -3, -3, 3, 1, -1, 3, 3, -3, 1];
            [ -3, -1, -1, -1, 1, -3, 3, -1, 1, -3, 3, 1];
            [ 1, -3, 3, 1, -1, -1, -1, 1, 1, 3, -1, 1];
            [1, -3, -1, 3, 3, -1, -3, 1, 1, 1, 1, 1];
            [-1, 3, -1, 1, 1, -3, -3, -1, -3, -3, 3, -1];
            [3, 1, -1, -1, 3, 3, -3, 1, 3, 1, 3, 3];
            [1, -3, 1, 1, -3, 1, 1, 1, -3, -3, -3, 1];
            [3, 3, -3, 3, -3, 1, 1, 3, -1, -3, 3, 3];
            [-3, 1, -1, -3, -1, 3, 1, 3, 3, 3, -1, 1];
            [ 3, -1, 1, -3, -1, -1, 1, 1, 3, 1, -1, -3];
            [1, 3, 1, -1, 1, 3, 3, 3, -1, -1, 3, -1];
            [ -3, 1, 1, 3, -3, 3, -3, -3, 3, 1, 3, -1];
            [-3, 3, 1, 1, -3, 1, -3, -3, -1, -1, 1, -3];
            [-1, 3, 1, 3, 1, -1, -1, 3, -3, -1, -3, -1];
            [-1, -3, 1, 1, 1, 1, 3, 1, -1, 1, -3, -1];
            [-1, 3, -1, 1, -3, -3, -3, -3, -3, 1, -1, -3];
            [1, 1, -3, -3, -3, -3, -1, 3, -3, 1, -3, 3];
            [1, 1, -1, -3, -1, -3, 1, -1, 1, 3, -1, 1];
            [ 1, 1, 3, 1, 3, 3, -1, 1, -1, -3, -3, 1];
            [1, -3, 3, 3, 1, 3, 3, 1, -3, -1, -1, 3];
            [1, 3, -3, -3, 3, -3, 1, -1, -1, 3, -1, -3];
            [-3, -1, -3, -1, -3, 3, 1, -1, 1, 3, -3, -3];
            [-1, 3, -3, 3, -1, 3, 3, -3, 3, 3, -1, -1];
            [ 3, -3, -3, -1, -1, -3, -1, 3, -3, 3, 1, -1]
            ];
        
        % table 5.5.1.2-2
phi_mtx_N_RB_2 = [
            [-1, 3, 1, -3, 3, -1, 1, 3, -3, 3, 1, 3, -3, 3, 1, 1, -1, 1, 3, -3, 3, -3, -1, -3];
            [ -3, 3, -3, -3, -3, 1, -3, -3, 3, -1, 1, 1, 1, 3, 1, -1, 3, -3, -3, 1, 3, 1, 1, -3];
            [ 3, -1, 3, 3, 1, 1, -3, 3, 3, 3, 3, 1, -1, 3, -1, 1, 1, -1, -3, -1, -1, 1, 3, 3];
            [ -1, -3, 1, 1, 3, -3, 1, 1, -3, -1, -1, 1, 3, 1, 3, 1, -1, 3, 1, 1, -3, -1, -3, -1];
            [ -1, -1, -1, -3, -3, -1, 1, 1, 3, 3, -1, 3, -1, 1, -1, -3, 1, -1, -3, -3, 1, -3, -1, -1];
            [-3, 1, 1, 3, -1, 1, 3, 1, -3, 1, -3, 1, 1, -1, -1, 3, -1, -3, 3, -3, -3, -3, 1, 1];
            [ 1, 1, -1, -1, 3, -3, -3, 3, -3, 1, -1, -1, 1, -1, 1, 1, -1, -3, -1, 1, -1, 3, -1, -3];
            [-3, 3, 3, -1, -1, -3, -1, 3, 1, 3, 1, 3, 1, 1, -1, 3, 1, -1, 1, 3, -3, -1, -1, 1];
            [-3, 1, 3, -3, 1, -1, -3, 3, -3, 3, -1, -1, -1, -1, 1, -3, -3, -3, 1, -3, -3, -3, 1, -3];
            [1, 1, -3, 3, 3, -1, -3, -1, 3, -3, 3, 3, 3, -1, 1, 1, -3, 1, -1, 1, 1, -3, 1, 1];
            [ -1, 1, -3, -3, 3, -1, 3, -1, -1, -3, -3, -3, -1, -3, -3, 1, -1, 1, 3, 3, -1, 1, -1, 3];
            [1, 3, 3, -3, -3, 1, 3, 1, -1, -3, -3, -3, 3, 3, -3, 3, 3, -1, -3, 3, -1, 1, -3, 1];
            [ 1, 3, 3, 1, 1, 1, -1, -1, 1, -3, 3, -1, 1, 1, -3, 3, 3, -1, -3, 3, -3, -1, -3, -1];
            [ 3, -1, -1, -1, -1, -3, -1, 3, 3, 1, -1, 1, 3, 3, 3, -1, 1, 1, -3, 1, 3, -1, -3, 3];
            [ -3, -3, 3, 1, 3, 1, -3, 3, 1, 3, 1, 1, 3, 3, -1, -1, -3, 1, -3, -1, 3, 1, 1, 3];
            [-1, -1, 1, -3, 1, 3, -3, 1, -1, -3, -1, 3, 1, 3, 1, -1, -3, -3, -1, -1, -3, -3, -3, -1];
            [ -1, -3, 3, -1, -1, -1, -1, 1, 1, -3, 3, 1, 3, 3, 1, -1, 1, -3, 1, -3, 1, 1, -3, -1];
            [ 1, 3, -1, 3, 3, -1, -3, 1, -1, -3, 3, 3, 3, -1, 1, 1, 3, -1, -3, -1, 3, -1, -1, -1];
            [1, 1, 1, 1, 1, -1, 3, -1, -3, 1, 1, 3, -3, 1, -3, -1, 1, 1, -3, -3, 3, 1, 1, -3];
            [ 1, 3, 3, 1, -1, -3, 3, -1, 3, 3, 3, -3, 1, -1, 1, -1, -3, -1, 1, 3, -1, 3, -3, -3];
            [ -1, -3, 3, -3, -3, -3, -1, -1, -3, -1, -3, 3, 1, 3, -3, -1, 3, -1, 1, -1, 3, -3, 1, -1];
            [ -3, -3, 1, 1, -1, 1, -1, 1, -1, 3, 1, -3, -1, 1, -1, 1, -1, -1, 3, 3, -3, -1, 1, -3];
            [ -3, -1, -3, 3, 1, -1, -3, -1, -3, -3, 3, -3, 3, -3, -1, 1, 3, 1, -3, 1, 3, 3, -1, -3];
            [-1, -1, -1, -1, 3, 3, 3, 1, 3, 3, -3, 1, 3, -1, 3, -1, 3, 3, -3, 3, 1, -1, 3, 3];
            [ 1, -1, 3, 3, -1, -3, 3, -3, -1, -1, 3, -1, 3, -1, -1, 1, 1, 1, 1, -1, -1, -3, -1, 3];
            [ 1, -1, 1, -1, 3, -1, 3, 1, 1, -1, -1, -3, 1, 1, -3, 1, 3, -3, 1, 1, -3, -3, -1, -1];
            [ -3, -1, 1, 3, 1, 1, -3, -1, -1, -3, 3, -3, 3, 1, -3, 3, -3, 1, -1, 1, -3, 1, 1, 1];
            [-1, -3, 3, 3, 1, 1, 3, -1, -3, -1, -1, -1, 3, 1, -3, -3, -1, 3, -3, -1, -3, -1, -3, -1];
            [ -1, -3, -1, -1, 1, -3, -1, -1, 1, -1, -3, 1, 1, -3, 1, -3, -3, 3, 1, 1, -1, 3, -1, -1];
            [1, 1, -1, -1, -3, -1, 3, -1, 3, -1, 1, 3, 1, -1, 3, 1, 3, -3, -3, 1, -1, -1, 1, 3]
            ];


    if N_PRB >= 3
        M_SC = N_PRB * 12;
        N_ZC = Function_Floor_to_Prime(M_SC);
        q_bar = N_ZC * (u+1) / 31;
        q = floor(q_bar + 0.5) + v * (-1)^floor(2*q_bar);
%         h.DRSSymInfo.NZC = N_ZC; % update object info
        x_seq = Function_Generate_ZC_Seq(q, N_ZC);
        b_seq = [x_seq, x_seq(1:M_SC-N_ZC)];
    end
            
	if N_PRB == 1
        q = -1;
        b_seq = exp(1i * phi_mtx_N_RB_1(u+1,:) * pi / 4);
    end
            
	if N_PRB == 2
     	q = -1;
        b_seq = exp(1i * phi_mtx_N_RB_2(u+1,:) * pi / 4);
    end
end